﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CAOS.Entity;
using CAOS.UnityOfWork;
using CAOS.Entity.Enum;

namespace CAOS.Web.Controllers
{
    [Authorize]
    public class RecursoController : BusinessController
    {
        public ViewResult Index()
        {
            var recursos = UnidadeDeTrabalho.RecursoRepository.List(s => s.SistemaID == Configuracao.Sistema.SistemaID, r => r.OrderBy(rec => rec.Nome), "Sistema");
            return View(recursos.ToList());
        }

        #region Criar

        public ActionResult Create()
        {
            this.ListarRecursosPai();
            return View();
        }

        [HttpPost]
        public ActionResult Create(Recurso recurso)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    recurso.Sistema = UnidadeDeTrabalho.SistemaRepository.GetByID(Configuracao.Sistema.SistemaID);
                    UnidadeDeTrabalho.RecursoRepository.Insert(recurso);
                    UnidadeDeTrabalho.Save();
                    return RedirectToAction("Index");
                }
                catch (CAOSDALException exception)
                {
                    ViewBag.Mensagem = exception.Message;
                    this.ListarRecursosPai(null, recurso.RecursoPaiID);
                    return View(recurso);
                }
            }

            return View(recurso);
        }

        #endregion

        #region Editar

        public ActionResult Edit(int id)
        {
            Recurso recurso = UnidadeDeTrabalho.RecursoRepository.GetByCondition(r => r.RecursoID == id);
            this.ListarRecursosPai(recurso, recurso.RecursoPaiID);
            return View(recurso);
        }

        [HttpPost]
        public ActionResult Edit(Recurso recurso)
        {
            if (ModelState.IsValid)
            {
                var recursoEditado = UnidadeDeTrabalho.RecursoRepository.GetByCondition(r => r.RecursoID == recurso.RecursoID, "Sistema");
                recursoEditado.Nome = recurso.Nome;

                try
                {
                    UnidadeDeTrabalho.RecursoRepository.Update(recursoEditado);
                    UnidadeDeTrabalho.Save();
                    return RedirectToAction("Index");
                }
                catch (CAOSDALException exception)
                {
                    ViewBag.Mensagem = exception.Message;
                    this.ListarRecursosPai(recurso, recursoEditado.RecursoPaiID);
                    return View(recurso);
                }
            }

            return View(recurso);
        }

        #endregion

        #region Deletar

        public ActionResult Delete(int id)
        {
            Recurso recurso = UnidadeDeTrabalho.RecursoRepository.GetByCondition(r => r.RecursoID == id, "Sistema");
            return View(recurso);
        }

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Recurso recurso = UnidadeDeTrabalho.RecursoRepository.GetByCondition(r => r.RecursoID == id, "Sistema");

            try
            {
                UnidadeDeTrabalho.RecursoRepository.Delete(id);
                UnidadeDeTrabalho.Save();
                return RedirectToAction("Index");
            }
            catch (CAOSDALException exception)
            {
                ViewBag.Mensagem = exception.Message;
                UnidadeDeTrabalho.RecursoRepository.Refresh(recurso);
                return View(recurso);
            }
        }

        #endregion

        private void ListarRecursosPai(Recurso recurso = null, int? idSelecionado = null)
        {
            var recursos = UnidadeDeTrabalho.RecursoRepository.List(r => r.SistemaID == Configuracao.Sistema.SistemaID);

            if (recurso != null)
            {
                recursos = recursos.Where(r => (r.RecursoPai == null ||
                                               (r.RecursoPai != null && r.RecursoPai.RecursoID != recurso.RecursoID)) && //O recurso pai não pode ser filho do recurso atual
                                               r.RecursoID != recurso.RecursoID //O recursos pai não pode ser o próprio recurso                                               
                                         );
            }

            ViewBag.RecursoPaiID = new SelectList(recursos, "RecursoID", "Codigo", recursos.SingleOrDefault(r=>r.RecursoID == idSelecionado));
        }

        protected override void Dispose(bool disposing)
        {
            UnidadeDeTrabalho.Dispose();
            base.Dispose(disposing);
        }
    }
}